import cv2
import numpy as np
import os
from datetime import datetime
from config import PREPROCESSED_IMAGES_DIR
from logger_config import setup_logger

# 创建日志记录器
logger = setup_logger('image_processing')

def preprocess_image(image_path, output_dir):
    """
    对图像进行简单的传统数字图像处理，包括适度的图像增强和噪声抑制。
    保留原始彩色信息，适用于车辆和车牌检测任务。

    Args:
        image_path (str): 输入图像的路径
        output_dir (str): 输出目录的路径
    
    Returns:
        str: 预处理后图像的完整路径
    """
    logger.info(f"开始预处理图像: {image_path}")
    
    try:
        # 读取图像
        img = cv2.imread(image_path)
        if img is None:
            error_msg = f"无法读取图像: {image_path}"
            logger.error(error_msg)
            raise ValueError(error_msg)
        
        logger.info("图像读取成功，开始处理...")
        
        # 1. 轻度噪声抑制 (保留细节和边缘)
        # 使用小核的高斯滤波，可以有效去除随机噪声，同时保留图像的边缘和细节信息
        # 3×3的核大小是一个平衡值，既能去噪又不会过度模糊图像
        denoised_img = cv2.GaussianBlur(img, (3, 3), 0)
        logger.debug("完成高斯模糊降噪")
        
        # 2. 颜色空间转换和增强
        # 转换到LAB颜色空间进行处理，LAB空间的优势是将亮度和色彩分离
        # 这样可以只增强亮度通道，保留原始色彩信息
        lab_img = cv2.cvtColor(denoised_img, cv2.COLOR_BGR2LAB)
        l, a, b = cv2.split(lab_img)  # 分离亮度通道和两个色彩通道
        
        # 只对亮度通道(L)进行CLAHE处理，保留颜色信息
        # CLAHE(限制对比度自适应直方图均衡化)可以有效增强局部对比度
        # clipLimit=2.0控制对比度增强的程度，tileGridSize定义局部区域大小
        clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
        enhanced_l = clahe.apply(l)
        
        # 将增强后的亮度通道与原始色彩通道合并
        enhanced_lab = cv2.merge([enhanced_l, a, b])

        # 转回BGR颜色空间，用于后续处理和保存
        enhanced_img = cv2.cvtColor(enhanced_lab, cv2.COLOR_LAB2BGR)
        logger.debug("完成颜色空间转换和增强")
        
        # 3. 轻度锐化，增强边缘细节
        # 创建锐化核，中心值大于周围值的和表示增强效果
        # [-0.5,-0.5,-0.5]
        # [-0.5, 5.0,-0.5]
        # [-0.5,-0.5,-0.5]
        # 这个核可以增强边缘和细节，使车牌字符和车辆轮廓更加清晰
        kernel = np.array([[-0.5, -0.5, -0.5], 
                          [-0.5,  5.0, -0.5], 
                          [-0.5, -0.5, -0.5]])
        
        # 应用轻度锐化，-1表示输出图像深度与输入相同
        processed = cv2.filter2D(enhanced_img, -1, kernel)
        logger.debug("完成锐化处理")
        
        # 生成输出文件名（使用时间戳）
        timestamp = datetime.now().strftime('%m%d%H%M%S')
        output_filename = f"{timestamp}_0.jpg"  # 0 表示预处理后的图片
        output_path = os.path.join(output_dir, output_filename)
        
        # 保存处理后的图像
        cv2.imwrite(output_path, processed)
        logger.info(f"预处理完成，图像已保存至: {output_path}")
        
        return output_path
        
    except Exception as e:
        error_msg = f"图像预处理失败: {str(e)}"
        logger.error(error_msg)
        raise

if __name__ == "__main__":
    # 测试代码
    test_image_path = os.path.join("uploads", "raw_images", "test.jpg")
    try:
        result_path = preprocess_image(test_image_path, PREPROCESSED_IMAGES_DIR)
        logger.info(f"测试成功，处理结果保存至: {result_path}")
    except Exception as e:
        logger.error(f"测试失败: {str(e)}") 